home *** CD-ROM | disk | FTP | other *** search
/ SGI Hot Mix 17 / Hot Mix 17.iso / HM17_SGI / research / lib / bmpbtn_alloc.pro < prev    next >
Encoding:
Text File  |  1997-07-08  |  14.6 KB  |  510 lines

  1. ;
  2. ; $Id: bmpbtn_alloc.pro,v 1.15 1997/03/18 00:07:48 lubos Exp $
  3. ;
  4. ;  WidBmpBtn
  5. ;   Widget Bitmap Button class library
  6. ;
  7. ; Copyright (c) 1993-1997, Research Systems, Inc.  All rights reserved.
  8. ;   Unauthorized reproduction prohibited.
  9. ;
  10. ; MODIFICATION HISTORY
  11. ;       Written by:     Joshua Goldstein,       12/93
  12. ;
  13.  
  14.  
  15. ;
  16. ;  BMPBTN_Icon
  17. ;       Return the bitmapped button toolbar icon
  18. ;
  19. FUNCTION BMPBTN_Icon
  20.     RETURN, [ $
  21.         [000B, 000B, 000B, 000B],           $
  22.         [000B, 000B, 000B, 000B],           $
  23.         [000B, 000B, 000B, 000B],           $
  24.         [128B, 255B, 001B, 000B],           $
  25.         [224B, 255B, 007B, 000B],           $
  26.         [240B, 000B, 015B, 000B],           $
  27.         [056B, 000B, 028B, 000B],           $
  28.         [024B, 000B, 024B, 000B],           $
  29.         [028B, 000B, 056B, 000B],           $
  30.         [012B, 000B, 048B, 000B],           $
  31.         [012B, 000B, 048B, 000B],           $
  32.         [012B, 000B, 048B, 000B],           $
  33.         [012B, 000B, 048B, 000B],           $
  34.         [012B, 000B, 240B, 031B],           $
  35.         [012B, 000B, 240B, 031B],           $
  36.         [012B, 000B, 112B, 029B],           $
  37.         [028B, 000B, 184B, 026B],           $
  38.         [024B, 000B, 088B, 029B],           $
  39.         [056B, 000B, 188B, 026B],           $
  40.         [240B, 000B, 095B, 029B],           $
  41.         [224B, 255B, 175B, 026B],           $
  42.         [128B, 255B, 085B, 029B],           $
  43.         [000B, 176B, 170B, 026B],           $
  44.         [000B, 112B, 085B, 029B],           $
  45.         [000B, 176B, 170B, 026B],           $
  46.         [000B, 112B, 085B, 029B],           $
  47.         [000B, 176B, 170B, 026B],           $
  48.         [000B, 240B, 255B, 031B],           $
  49.         [000B, 240B, 255B, 031B],           $
  50.         [000B, 000B, 000B, 000B],           $
  51.         [000B, 000B, 000B, 000B],           $
  52.         [000B, 000B, 000B, 000B]            $
  53.         ]
  54. END
  55.  
  56.  
  57. ;
  58. ;  BMPBTN_Copy
  59. ;   Copy a button.  2 copy methods:
  60. ;
  61. ;   if( copy != NULL)       { *copy = *ptr; free(ptr); }
  62. ;   else                    { *(copy = malloc(...)) = *ptr; }
  63. ;
  64. PRO BMPBTN_Copy, Ptr, Copy
  65.     GenCopy, Ptr, Copy, /HASVALUE
  66. END
  67.  
  68.  
  69. ;
  70. ;  BMPBTN_Destroy
  71. ;   Release resources for the given button
  72. ;
  73. PRO BMPBTN_Destroy, Ptr
  74.     GenDestroy, Ptr, /HASVALUE
  75. END
  76.  
  77.  
  78. PRO BMPBTN_DrawBits, DlgInfo, Obj
  79.  
  80.     WSET, DlgInfo.WindowId
  81.     ERASE
  82.  
  83.     Ptr2Obj, Obj.Value1, Bits
  84.  
  85.     ;   Fill in preview
  86.  
  87.     IF DlgInfo.Preview NE 0 THEN $
  88.     WIDGET_CONTROL, DlgInfo.Preview, SET_VALUE=Bits
  89.  
  90.     ;   Fill in Drawable based on size
  91.  
  92.     NBits   = DlgInfo.NBits
  93.     Delta   = DlgInfo.Delta
  94.     Last    = 389               ; NBits * Delta + 5
  95.  
  96.     Pix     = BYTARR(NBits, NBits)
  97.     White   = !D.N_COLORS-1
  98.     FOR I=NBits-1,0,-1 DO BEGIN
  99.         FOR J=0,NBits - 1 DO BEGIN
  100.             Mask    = ISHFT(1, J AND 7)
  101.             Offset  = ISHFT(J, -3)
  102.             IF (Bits[Offset, I] AND Mask) EQ 0 THEN Pix[J,I] = White
  103.         ENDFOR
  104.     ENDFOR
  105.  
  106.     TV, REBIN(Pix, 384, 384, /SAMPLE), 5, 5, /ORDER
  107.  
  108.     ;   Draw lines
  109.  
  110.     Gray    = !D.N_COLORS / 2
  111.     FOR I=0,NBits DO BEGIN
  112.         Offset  = I * Delta + 5
  113.         PLOTS, [ 5, Last ], [ Offset, Offset ], /DEVICE, COLOR=Gray
  114.         PLOTS, [ Offset, Offset ], [ 5, Last ], /DEVICE, COLOR=Gray
  115.     ENDFOR
  116.  
  117.     Obj2Ptr, Bits, Obj.Value1
  118. END
  119.  
  120.  
  121. ;
  122. ;  BMPBTN_Event
  123. ;   Event handling routine for a button dialog.
  124. ;
  125. PRO BMPBTN_Event, Event
  126.  
  127.   COMMON WidEd_Comm
  128.  
  129.     WIDGET_CONTROL, Event.Id, GET_UVALUE=Ev               ; Get Event
  130.     WIDGET_CONTROL, Event.Top, GET_UVALUE=Binfo, /NO_COPY ; Get Dialog Info
  131.     Ptr2Obj, Binfo.ObjPtr, Obj                            ; Get Object
  132.  
  133.     IDirty  = 1
  134.  
  135.     CASE Ev OF
  136.  
  137.     'NAME':     Obj.Name        = Event.Value
  138.     'FRAME':    Obj.FrameSize   = Event.Value
  139.     'UVALUE':   Obj.Uvalue      = Event.Value
  140.     'XOFFSET':  Obj.XOffset     = Event.Value
  141.     'YOFFSET':  Obj.YOffset     = Event.Value
  142.     'DRAW':     BEGIN
  143.         IDirty  = 0
  144.         IF Event.Press NE 0 AND Binfo.Press EQ 0 THEN BEGIN
  145.  
  146.             IF Event.Press EQ 1 THEN            Binfo.Clear = -1 $
  147.             ELSE IF Event.Press EQ 2 THEN       Binfo.Clear = 1 $
  148.             ELSE                                Binfo.Clear = 0
  149.  
  150.             Binfo.Press     = 1;
  151.             Binfo.CurrX     = -1;
  152.             Binfo.CurrY     = -1;
  153.             WSET, BInfo.WindowId
  154.         ENDIF
  155.  
  156.         IF Event.Release NE 0 THEN BEGIN
  157.             Binfo.Press     = 0;
  158.             Ptr2Obj, Obj.Value1, Bits
  159.         IF Binfo.Preview NE 0 THEN $
  160.             WIDGET_CONTROL, Binfo.Preview, SET_VALUE=Bits
  161.             Obj2Ptr, Bits, Obj.Value1
  162.         ENDIF
  163.  
  164.         IF Binfo.Press AND $
  165.            Event.X GE 5 AND Event.X LT 389 AND $
  166.            Event.Y GE 5 AND Event.Y LT 389 THEN BEGIN
  167.  
  168.             X       = (Event.X - 5) / Binfo.Delta;
  169.             Y       = Binfo.NBits - 1 - (Event.Y - 5) / Binfo.Delta;
  170.  
  171.             ;       Has to be a new square
  172.             IF X NE Binfo.CurrX OR Y NE Binfo.CurrY THEN BEGIN
  173.  
  174.                 Binfo.CurrX     = X
  175.                 Binfo.CurrY     = Y
  176.  
  177.                 ;       convert back to device coords
  178.  
  179.                 Ptr2Obj, Obj.Value1, Bits
  180.  
  181.                 Mask    = ISHFT(1, X AND 7)
  182.                 Offset  = ISHFT(X, -3)
  183.  
  184.                 ;       Determine what we are doing if initial event
  185.                 IF Binfo.Clear EQ -1 THEN $
  186.                     Binfo.Clear = (Bits[Offset, Y] AND Mask) NE 0
  187.  
  188.                 IF Binfo.Clear THEN BEGIN
  189.                     Color           = 255
  190.                     Bits[Offset,Y]  = Bits[Offset, Y] AND (NOT Mask)
  191.                 ENDIF ELSE BEGIN
  192.                     Color           = 0
  193.                     Bits[Offset,Y]  = Bits[Offset, Y] OR Mask
  194.                 ENDELSE
  195.  
  196.                 X1      = X * Binfo.Delta + 6
  197.                 X2      = X1 + Binfo.Delta - 1
  198.                 Y1      = (Binfo.NBits - 1 - Y) * Binfo.Delta + 5
  199.                 Y2      = Y1 + Binfo.Delta - 1
  200.                 POLYFILL, /DEVICE, [X1, X2, X2, X1], [Y1, Y1, Y2, Y2], $
  201.                     COLOR=Color
  202.                 Obj2Ptr, Bits, Obj.Value1
  203.                 IDirty  = 1
  204.             ENDIF
  205.         ENDIF
  206.         END
  207.     'BMP16':        BEGIN
  208.         Obj.Size        = 0
  209.         Binfo.NBits     = 16
  210.         Binfo.Delta     = 24
  211.         Obj2Ptr, BYTARR(2,16), Obj.Value1
  212.         BMPBTN_DrawBits, Binfo, Obj
  213.         ENDIF
  214.     'BMP32':        BEGIN
  215.         Obj.Size        = 1
  216.         Binfo.NBits     = 32
  217.         Binfo.Delta     = 12
  218.         Obj2Ptr, BYTARR(4,32), Obj.Value1
  219.         BMPBTN_DrawBits, Binfo, Obj
  220.         ENDIF
  221.     'BMP64':        BEGIN
  222.         Obj.Size        = 2
  223.         Binfo.NBits     = 64
  224.         Binfo.Delta     = 6
  225.         Obj2Ptr, BYTARR(8,64), Obj.Value1
  226.         BMPBTN_DrawBits, Binfo, Obj
  227.         ENDIF
  228.     'INVERT':   BEGIN
  229.         Ptr2Obj, Obj.Value1, Bits
  230.         Obj2Ptr, (NOT Bits), Obj.Value1
  231.         BMPBTN_DrawBits, Binfo, Obj
  232.         END
  233.     'DONE':     BEGIN
  234.         Accept, Obj, Binfo.ObjPtr
  235.         WIDGET_CONTROL, Event.Top, SET_UVALUE=Binfo, /NO_COPY
  236.         WIDGET_CONTROL, Event.Top, /DESTROY
  237.         RETURN
  238.         END
  239.     'IGNORE':   ; Ignore
  240.  
  241.     'CANCEL':   BEGIN
  242.         Cancel, Obj, Binfo.ObjPtr
  243.         RETURN
  244.         END
  245.     ELSE:           MESSAGE, 'Unprocessed event: ' + Ev
  246.     ENDCASE
  247.  
  248.     Dirty   = Dirty OR IDirty
  249.  
  250.     SetNextFocus, Binfo, Event      ; Set next keyboard focus as necessary
  251.     Obj2Ptr, Obj, Binfo.ObjPtr      ; Put object back into pointer
  252.     WIDGET_CONTROL, Event.Top, SET_UVALUE=Binfo, /NO_COPY
  253. END
  254.  
  255.  
  256. ;
  257. ;  BMPBTN_Build
  258. ;   Create a dialog box a bitmap button object.  If ptr is nil then
  259. ;   create the object as well.
  260. ;
  261. PRO BMPBTN_Build, Ptr, ParPtr
  262.  
  263.   COMMON WidEd_Comm
  264.  
  265.     BMPBTN_Alloc, ParPtr, Ptr               ; Allocate object if necessary
  266.     MgrName = 'WE_BMPBTN' + STRTRIM(Ptr, 2) ; Create dialog box name
  267.     IF XRegistered(MgrName) THEN RETURN     ; See if it already exists
  268.  
  269.     Title   = GetId(Ptr) + '(Child of ' + GetId(ParPtr) + ')'
  270.     Ptr2Obj, Ptr, Obj
  271.  
  272.     ;   Create dialog box
  273.  
  274.     IF SmallScreen[0] NE 0 THEN BEGIN
  275.         Base    = WIDGET_BASE(/COLUMN, TITLE=Title, GROUP_LEADER=TopDlg, $
  276.                         X_SCROLL_SIZE=SmallScreen[0], $
  277.                         Y_SCROLL_SIZE=SmallScreen[1] )
  278.     ENDIF ELSE BEGIN
  279.         Base    = WIDGET_BASE(/COLUMN, TITLE=Title, GROUP_LEADER=TopDlg)
  280.     ENDELSE
  281.     Foci    = LONARR(5)
  282.  
  283.     ;   Basic information Related Info
  284.  
  285.     Base1   = WIDGET_BASE(Base, /FRAME, /COLUMN)
  286.     Lab     = WIDGET_LABEL(Base1, VALUE="Basic Information")
  287.     Base2   = WIDGET_BASE(Base1, /ROW, SPACE=30 )
  288.     Draw    = WIDGET_DRAW(Base2, RETAIN=2, /BUTTON_EVENTS, /MOTION_EVENTS, $
  289.                               UVALUE='DRAW', XSIZE=64*6+11, YSIZE=64*6+11 )
  290.     Base3   = WIDGET_BASE(Base2)
  291.  
  292.     ;  No preview on Mac/PC because can't resize button
  293.  
  294. ;
  295. ;   Preview works fine on a Mac now. (It ought to pork on Windows too, so we'll
  296. ;   build the button on all platforms.
  297. ;
  298.  
  299.  ;   IF !Version.OS EQ 'MacOS' OR !Version.OS EQ 'Win32' THEN BEGIN
  300.  ;   Preview = 0
  301.  ;   ENDIF ELSE BEGIN
  302.     Preview = WIDGET_BUTTON(Base3, VALUE=BYTARR(8,64),YOFFSET=160, $
  303.                         UVALUE='IGNORE')
  304.  ;   ENDELSE
  305.     Base2   = WIDGET_BASE(Base1, /ROW)
  306.     Base3   = WIDGET_BASE(Base2, /FRAME, /ROW)
  307.     Label   = WIDGET_LABEL(Base3, VALUE="Bitmap Size:")
  308.     Btns    = LONARR(3)
  309.     Btns[0] = WIDGET_BUTTON(Base3, VALUE='16x16', UVALUE="BMP16", /NO_REL)
  310.     Btns[1] = WIDGET_BUTTON(Base3, VALUE='32x32', UVALUE="BMP32", /NO_REL)
  311.     Btns[2] = WIDGET_BUTTON(Base3, VALUE='64x64', UVALUE="BMP64", /NO_REL)
  312.  
  313.     Dummy   = WIDGET_LABEL(Base2, VALUE="  ")
  314.     Dummy   = WIDGET_BUTTON(Base2, VALUE="Invert", UVALUE="INVERT" )
  315.  
  316.     ;       Fill in Drawable based on size
  317.     NBits   = ISHFT(1, 4 + Obj.Size)
  318.  
  319.     BuildOther, Base, Obj, Foci, 0, /FRAME
  320.  
  321.     Base1   = WIDGET_BASE(Base, /FRAME, /COLUMN)
  322.     Lab     = WIDGET_LABEL(Base1, VALUE="Button Appearance Controls")
  323.     BuildXY, Base1, Obj, Foci, 3, /OFFSET
  324.     BuildOkCancel, Base, Obj
  325.  
  326.     DlgInfo     = {         $
  327.         Foci:       Foci,   $
  328.         ObjPtr:     Ptr,    $
  329.         Delta:      6*64/NBits, $
  330.         NBits:      NBits,  $
  331.         Preview:    Preview,$
  332.         WindowId:   0,      $
  333.         Press:      0,      $
  334.         Clear:      0,      $
  335.         CurrX:      -1,     $
  336.         CurrY:      -1      $
  337.     }
  338.     Obj.Dialog  = Base
  339.     WIDGET_CONTROL, Base, /REALIZE
  340.     XMANAGER, MgrName, Base, EVENT_HANDLER='BMPBTN_Event', $
  341.         CLEANUP='MISC_Kill'
  342.     WIDGET_CONTROL, Btns[Obj.Size], /SET_BUTTON ; Set button size
  343.     WIDGET_CONTROL, Draw, GET_VALUE=WindowId
  344.     DlgInfo.WindowId        = WindowId
  345.  
  346.     BMPBTN_DrawBits, DlgInfo, Obj
  347.  
  348.     WIDGET_CONTROL, Base, SET_UVALUE=DlgInfo, /NO_COPY
  349.     Obj2Ptr, Obj, Ptr
  350. END
  351.  
  352.  
  353. ;
  354. ;  BMPBTN_Save
  355. ;   Save button information to a file.
  356. ;   This is a simple object to save.
  357. ;
  358. PRO BMPBTN_Save, Unit, Ptr
  359.   COMMON WidEd_Comm
  360.  
  361.     Ptr2Obj, Ptr, Obj
  362.     Ptr2Obj, Obj.Value1, Value
  363.  
  364.     ON_IOERROR, BadWrite
  365.  
  366.     WRITEU, Unit, Obj
  367.     WRITEU, Unit, Value
  368.     Obj2Ptr, Value, Obj.Value1
  369.     Obj2Ptr, Obj, Ptr
  370.     RETURN
  371.  
  372.   BadWrite:
  373.     Dirty   = 2
  374.     Obj2Ptr, Value, Obj.Value1
  375.     Obj2Ptr, Obj, Ptr
  376. END
  377.  
  378.  
  379. ;
  380. ;  BMPBTN_Restore
  381. ;   Read in a button object from a file
  382. ;
  383. PRO BMPBTN_Restore, Unit, Parent, Ptr
  384.  
  385.     BMPBTN_Alloc, Parent, Ptr
  386.     Ptr2Obj, Ptr, Obj
  387.  
  388.     SaveV1  = Obj.Value1        ; Save value pointer (crushed by read)
  389.     READU, Unit, Obj            ; Read in object
  390.  
  391.     NBits   = ISHFT(1, 4+Obj.Size)
  392.     Value   = BYTARR(NBits/8, NBits)
  393.     READU, Unit, Value
  394.  
  395.     Obj.Value1  = SaveV1        ; Restore saved value pointer
  396.     Obj2Ptr, Value, Obj.Value1  ; Store names in value pointer
  397.  
  398.     Obj.Dialog  = 0             ; Clear old (and invalid) value
  399.     Obj.Next    = 0             ; Clear old (and invalid) value
  400.     Obj.Parent  = Parent        ; Parent changes every run
  401.     Obj2Ptr, Obj, Ptr           ; Save what we've read
  402. END
  403.  
  404.  
  405. ;
  406. ;  BMPBTN_Generate
  407. ;   Create a button object for previewing
  408. ;
  409. PRO BMPBTN_Generate, Base, Ptr
  410.  
  411.   COMMON WidEd_Comm
  412.  
  413.     Ptr2Obj, Ptr, Obj
  414.     Id  = 0L            ; Prevent EXECUTE from creating a new variable
  415.  
  416.     ;   Build a command string
  417.  
  418.     Cmd = 'Id = WIDGET_BUTTON(Base'
  419.     IAddCmd, Cmd, Obj.FrameSize, 'FRAME'
  420.     IAddCmd, Cmd, Obj.XOffset, 'XOFFSET'
  421.     IAddCmd, Cmd, Obj.YOffset, 'YOFFSET'
  422.     Ptr2Obj, Obj.Value1, Bits, /COPY
  423.     Cmd = Cmd + ',VALUE=Bits'
  424.     Obj2Ptr, Obj, Ptr
  425.  
  426.     ; Create button by executing the command string we just built
  427.  
  428.     IF EXECUTE(Cmd+')') NE 1 THEN BEGIN
  429.         MESSAGE,'Could not create Button ' + VarName(Ptr)
  430.     ENDIF
  431. END
  432.  
  433.  
  434. ;
  435. ;  BMPBTN_GenWid
  436. ;   Create IDL code for creating a BUTTON
  437. ;
  438. PRO BMPBTN_GenWid, Unit, Ptr, Parent
  439.  
  440.     Name    = VarId(Ptr)            ; Get variable name of object
  441.     Ptr2Obj, Ptr, Obj               ; Get Object info
  442.  
  443.     ValueName       = 'BMP' + STRTRIM(Ptr,2)    ; Create value name
  444.  
  445.  
  446.     Ptr2Obj, Obj.Value1, Bits
  447.     XPRINTF, Unit, '  ', ValueName, ' = [ $'
  448.  
  449.     Sz      = SIZE(Bits)
  450.     FOR I=0,Sz[2]-2 DO BEGIN
  451.         XPRINTF, Unit, FORMAT='("    [ ",100(I0,"b, "))', $
  452.             Bits[0:Sz[1]-2,I], /NO_EOL
  453.         XPRINTF, Unit, FORMAT='(I0, "b ], $")', Bits[Sz[1]-1,I]
  454.     ENDFOR
  455.  
  456.     XPRINTF, Unit, FORMAT='("    [ ",100(I0,"b, "))', $
  457.         Bits[0:Sz[1]-2,Sz[2]-1], /NO_EOL
  458.  
  459.     ; Can't do multiple lines using XPRINTF
  460.     XPRINTF, Unit, FORMAT='(I0, "b ]  $")', Bits[Sz[1]-1, Sz[2]-1]
  461.     PRINTF, Unit, "  ]"
  462.  
  463.     XPRINTF, FORMAT='("  ", A, " = WIDGET_BUTTON( ",A,",VALUE=",A)', $
  464.         Unit, Name, Parent, ValueName, /NO_EOL
  465.     ISaveCmd, Unit, Obj.FrameSize, "FRAME"
  466.     SSaveCmd, Unit, UValue(Obj, Ptr), "UVALUE"
  467.     ISaveCmd, Unit, Obj.XOffset, "XOFFSET"
  468.     ISaveCmd, Unit, Obj.YOffset, "YOFFSET"
  469.     XPRINTF, Unit, ')'
  470.  
  471.     Obj2Ptr, Bits, Obj.Value1
  472.     Obj2Ptr, Obj, Ptr
  473. END
  474.  
  475.  
  476. ;
  477. ;  BMPBTN_Alloc
  478. ;       Allocate a bitmap button object. Don't allocate if ptr is non-nil
  479. ;
  480. PRO BMPBTN_Alloc, Parent, Ptr
  481.   COMMON WidEd_Comm
  482.  
  483.     IF KEYWORD_SET(Ptr) NE 0 THEN RETURN    ; if(ptr != NULL) return;
  484.  
  485.     Ptr     = WIDGET_BASE(GROUP=TopDlg)     ; Make a pointer
  486.     ValueId = WIDGET_BASE(GROUP=TopDlg)     ; Make a pointer for value too
  487.     Value   = BYTARR(2,16)
  488.     Obj2Ptr, Value, ValueId                 ; Default value is all zeros
  489.  
  490.     ;   Make a Bitmap Button object
  491.  
  492.     Obj = {                     $
  493.         WE_BMPBTN,              $
  494.         Type:       'BMPBTN',   $
  495.         Parent:     Parent,     $ ; Pointer to parent
  496.         Id:         NewId(),    $ ; Permanent Id
  497.         Dialog:     0L,         $ ; Save Dialog ID (need for Cut consistency)
  498.         Next:       0L,         $ ; index of next child/free/top
  499.         Name:       '',         $ ; object name
  500.         FrameSize:  0,          $
  501.         XOffset:    0,          $
  502.         YOffset:    0,          $
  503.         UValue:     '',         $
  504.         Size:       0,          $ ; Dflt: 16x16.  Enum Size {16x16,32x32,64x64}
  505.         Value1:     ValueId     $
  506.     }
  507.  
  508.     Obj2Ptr, Obj, Ptr
  509. END
  510.